#pragma once // 防止头文件被多次包含

// 包含标准输入输出流库，用于错误信息输出
#include <iostream>
// 包含字符串处理库，用于文件路径处理
#include <string>
// 包含系统数据类型定义，如 mode_t 等
#include <sys/types.h>
// 包含文件状态相关定义，如 stat 结构体
#include <sys/stat.h>
// 包含文件控制选项，如 O_RDONLY, O_WRONLY 等标志
#include <fcntl.h>
// 包含 UNIX 标准函数，如 close, read, write 等
#include <unistd.h>

/**
 * 打开设备或文件
 *
 * 这个函数封装了底层的 open 系统调用，用于打开指定的设备或文件。
 * 在聊天服务器项目中，主要用于客户端程序中打开终端设备以进行输出重定向。
 *
 * @param dev 要打开的设备或文件路径，如 "/dev/pts/2"
 * @param flags 打开模式标志，如 O_RDONLY, O_WRONLY, O_RDWR 等
 * @return 成功返回文件描述符（非负整数），失败返回 -1
 */
int OpenDev(const std::string &dev, int flags)
{
    // 调用系统的 open 函数打开文件或设备
    // c_str() 将 C++ 风格字符串转换为 C 风格字符串，因为系统调用需要 C 风格字符串
    int fd = open(dev.c_str(), flags);
    if (fd < 0) // 检查是否打开成功
    {
        // 如果打开失败，输出错误信息
        std::cerr << "open error" << std::endl;
        return -1;
    }
    // 返回成功打开的文件描述符
    return fd;
    // dup2(fd, 1);  // 被注释的代码：如果取消注释，会将标准输出(1)重定向到新打开的文件描述符
}